package com.cos.shop.web.controller;

import com.cos.shop.common.Const;
import com.cos.shop.util.StringUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author: COS
 * @time: 2022/2/23 13:58
 * @description: 帮助我们调用处理请求的方法以及统一处理请求操作的方法
 */
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            String type = request.getParameter("type");
            if (!StringUtils.isNotEmpty(type)) {
                //空字符串 直接从定向到首页
                response.sendRedirect(request.getContextPath() + "/index.jsp");
            }
            //获取当前运行对象的类对象
            //因为继承关系 接收到请求的子类没有service方法,就默认去找父类的service执行,
            //这个this就是接受到请求的子类的当前实例
            Class<? extends BaseServlet> aClass = this.getClass();
            //使用方法名 type的值获取方法对象
            Method method = aClass.getMethod(type, HttpServletRequest.class, HttpServletResponse.class);
            //执行方法 根据方法名和方法的参数列表 来执行对应的方法
            // 统一设计 所有子类都会返回一个字符串
            String invoke = (String) method.invoke(this, request, response);
            //统一处理所有转发,重定向,字符串的写出(如json)
            //使用这个字符串作为标识 来判断做那个处理 (转发,重定向,字符串的写出(如json))
            if (invoke != null) {
                if (invoke.contains(Const.FORWARD)) {
                    //子类要求转发  forward:index.jsp
                    //                String path = invoke.substring(invoke.indexOf(":")+1);
                    String path = invoke.split(":")[1];
                    request.getRequestDispatcher(path).forward(request, response);
                } else if (invoke.contains(Const.REDIRECT)) {
                    //子类是要求重定向
                    String path = invoke.split(":")[1];
                    response.sendRedirect(request.getContextPath() + "/" + path);
                } else {
                    //不是转发也不是重定向 直接写出字符串
                    response.getWriter().println(invoke);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            //出现异常 设置异常提示信息
            request.setAttribute("msg", "哎呀~出错啦~ O(∩_∩)O哈哈~");
            //转发到信息页面
            request.getRequestDispatcher("message.jsp").forward(request, response);
        }
    }
}
